/***********************************************************************************
 * 文件名： soft_fifo.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		一个软件模拟的FIFO控制器类。仅支持单字节数据存取。使用前需要先定义实例，可以实例化多
 *  个对象。
 *      注意：暂不支持在不同线程同时操作同一个SoftFifo实例，如果这么做程序将会出现异常，需要
 *  自己处理资源互斥问题。
 * 修改记录：
 * 	2021/2/3: 初版。 刘言。
***********************************************************************************/
#include <stdlib.h>
#include "soft_fifo.h"

SoftFifo *new_SoftFifo(uint8_t *buff, uint16_t buff_size)
{
    SoftFifo *obj = malloc(sizeof(SoftFifo));
    SoftFifo_Init(obj, buff, buff_size);
    return obj;
}

void SoftFifo_Init(SoftFifo *obj, uint8_t *buff, uint16_t buff_size)
{
    obj->Buff = buff;
    obj->BuffSize = buff_size;
    obj->FreeCount = buff_size;
    obj->InPointer = 0;
    obj->OutPointer = 0;
}

bool SoftFifo_IsFull(SoftFifo *obj)
{
    return (obj->FreeCount == 0);
}

bool SoftFifo_IsEmpty(SoftFifo *obj)
{
    return (obj->FreeCount == obj->BuffSize);
}

bool SoftFifo_Write(SoftFifo *obj, uint8_t dat)
{
    if (obj->FreeCount == 0)    // 没有空间了
        return false;
    obj->Buff[obj->InPointer] = dat;    // 存入数据
    obj->InPointer++;           // 输入指针指向下一个空间
    if (obj->InPointer >= obj->BuffSize)//判断输入是否超出FIFO界限
        obj->InPointer = 0;     //如果超出则从零开始存放
    obj->FreeCount--;           //剩余空间-1
	return true;
}

uint8_t SoftFifo_Read(SoftFifo *obj)
{
    uint8_t dat;

    if(obj->FreeCount == obj->BuffSize) // FIFO为空
        return 0;
    dat = obj->Buff[obj->OutPointer];   // 读出数据
    obj->OutPointer++;                  //  输出数据指针指向下一个
    if(obj->OutPointer >= obj->BuffSize)
        obj->OutPointer = 0;
    obj->FreeCount++;
	return dat;
}
